﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Day03
{
    public class Hand:IEnumerable
    {
        public List<IThrowable> AllObject
        {
            get;
            set;
        }
        //传统代码，太麻烦，而且要结合实现IEnumerator接口的类HandEnumerator使用
        //public IEnumerator GetEnumerator()
        //{
        //    return new HandEnumerator() { Targets = AllObject };//将集合传入
        //}
        /// <summary>
        /// 简化版代码，语法糖，通过MoveNext方法执行方法体，通过yield暂停及回来
        /// </summary>
        /// <returns></returns>
        public IEnumerator GetEnumerator()
        {
            //语法糖，简单的语法好用
            //编译器自动创建迭代器代码
            //程序执行过程：
            //1.当第一次调用MoveNext方法时，执行方法体。
            //2.执行到yield return处，暂时退出。
            //3.再次调用MoveNext方法，从yield return处继续执行
            for (int i = 0; i < AllObject.Count; i++)
            {
                yield return AllObject[i];//暂时（yield） 退出方法
            }
        }
        public void Throwing()
        {
            for (int i = 0; i < AllObject.Count; i++)
            {
                //多态：父类 同一方法 在 不同子类中 不同实现
                //调用的是接口方法
                AllObject[i].Fly();
            }
        }

        public class HandEnumerator : IEnumerator
        {
            public List<IThrowable> Targets{get;set;}
            private int index = -1;//注意从-1开始

            public object Current
            {
                get { return Targets[index]; }
            }

            public bool MoveNext()
            {
                //index++;
                //if (index <= Targets.Count - 1)
                //{
                //    return true;
                //}
                //else
                //{
                //    return false;
                //}
                return ++index <= Targets.Count - 1;//等价于以上注释
            }

            public void Reset()
            {
                
            }
        }
    }
}